来自this等问题和this,我的印象是从原始类型继承会导致编译器错误。但是,以下代码编译并在Ideone上产生预期的输出。.#includeenumclassTest:unsignedshortint{TEST,TEST2,TEST3,TEST4};intmain(){//yourcodegoeshereTestans=Test::TEST3;if(ans==Test::TEST3){std::coutclass也是enum的事实是否会改变前两个问答中的答案?这是标准明确定义的行为吗? 最佳答案 这并不意味着继承,而是选择枚举的底
来自this等问题和this,我的印象是从原始类型继承会导致编译器错误。但是,以下代码编译并在Ideone上产生预期的输出。.#includeenumclassTest:unsignedshortint{TEST,TEST2,TEST3,TEST4};intmain(){//yourcodegoeshereTestans=Test::TEST3;if(ans==Test::TEST3){std::coutclass也是enum的事实是否会改变前两个问答中的答案?这是标准明确定义的行为吗? 最佳答案 这并不意味着继承,而是选择枚举的底
类atomic包含atomicversionsofmanydifferentvariabletypes.但是,它不包含原子枚举类型。有没有办法使用原子枚举或自己制作?据我所知,我唯一的选择是要么不使用枚举,要么使用互斥体/信号量来保护它们。注意:这个bugreport我发现提到“std::atomicenumsupport”,但我没有看到C++标准中提到原子枚举类型,所以我不确定它指的是什么。 最佳答案 你可以像这样创建一个原子枚举:#includeenumDecision{stay,flee,dance};std::atomice
类atomic包含atomicversionsofmanydifferentvariabletypes.但是,它不包含原子枚举类型。有没有办法使用原子枚举或自己制作?据我所知,我唯一的选择是要么不使用枚举,要么使用互斥体/信号量来保护它们。注意:这个bugreport我发现提到“std::atomicenumsupport”,但我没有看到C++标准中提到原子枚举类型,所以我不确定它指的是什么。 最佳答案 你可以像这样创建一个原子枚举:#includeenumDecision{stay,flee,dance};std::atomice
enumclassE{};intmain(){Ee1{0};//okEe2=0;//notok//error:cannotinitializeavariableof//type'E'withanrvalueoftype'int'}我的编译器是clang4.0,带有选项-std=c++1z。预计Ee2=0;不行,因为E是强类型的。不过,让我吃惊的是Ee1{0};应该没问题。为什么没有static_cast可以用整数初始化强类型枚举? 最佳答案 看reference自C++17起允许使用列表初始化器:Bothscopedenumerat
enumclassE{};intmain(){Ee1{0};//okEe2=0;//notok//error:cannotinitializeavariableof//type'E'withanrvalueoftype'int'}我的编译器是clang4.0,带有选项-std=c++1z。预计Ee2=0;不行,因为E是强类型的。不过,让我吃惊的是Ee1{0};应该没问题。为什么没有static_cast可以用整数初始化强类型枚举? 最佳答案 看reference自C++17起允许使用列表初始化器:Bothscopedenumerat
使用GCC,如果您在enum值上switch并且其中一个枚举缺少case语句,则会发出警告。当您添加default项时,将不再发出警告,这在一般情况下是有意义的。有没有办法使用default语句,如果没有覆盖所有enum值,仍然会发出警告?由于我的函数可能处理不纯的输入,我想涵盖通用情况,但仍然会收到有关缺少枚举情况的编译器警告。目前我最终在switch语句之后分配了一个默认值。 最佳答案 -Wswitch-enum,但不幸的是,只有最新版本支持此功能。(您当然可以通过在开关外使用goto并省略默认值来模拟您想要的行为,但我强烈建议
使用GCC,如果您在enum值上switch并且其中一个枚举缺少case语句,则会发出警告。当您添加default项时,将不再发出警告,这在一般情况下是有意义的。有没有办法使用default语句,如果没有覆盖所有enum值,仍然会发出警告?由于我的函数可能处理不纯的输入,我想涵盖通用情况,但仍然会收到有关缺少枚举情况的编译器警告。目前我最终在switch语句之后分配了一个默认值。 最佳答案 -Wswitch-enum,但不幸的是,只有最新版本支持此功能。(您当然可以通过在开关外使用goto并省略默认值来模拟您想要的行为,但我强烈建议
在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次
在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次